home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / util / rexx / ScionToMosaic.lha / ScionToMosaic.rexx
OS/2 REXX Batch file  |  1994-10-08  |  56KB  |  1,571 lines

  1. /* © Harold H. Ipolyi        11 June 1994
  2.  
  3.         Requires ScionGenealogist V 3.13+
  4.  
  5. -------------------------------README----------------------------------------
  6. Short: ScionGenealogist > Mosaic.html
  7.  
  8. Type: util/rexx
  9.  
  10. Uploader: ipolyi@pat.mdc.com
  11.  
  12. Author: Harold H. Ipolyi, P.O.Box 891206, Houston, Tx 77289-1206
  13.  
  14.             Release History:
  15.  
  16.        11 Jun 1994 . ScionGenealogist V 3.06
  17. Rev01: 19 Jun 1994 . MakeDir(Gdir) fixed; extra comments processed.
  18. Rev02: 25 Jun 1994 . Fixed descenders; Women in List italicised
  19.                    . ScionGenealogist V 3.13
  20. Rev03:  3 Sep 1994 . Replace occurrences of "<ScionIRN>" by Data Base NAMES
  21.                    . e.g. Replace any <101> by Iam Onehundredone, Jr.
  22.                    . Added Family Info file processing; Ancestor trees
  23.                    . Added descendant charts
  24.                    . Women italicised; men boldface everywhere
  25.                    . Added creation of a textual file "GenealogyOf..."
  26.  
  27. Arexx script to convert ScionGenealogist data base to Mosaic hypertext format.
  28.  
  29.  
  30.  WHY?    some others in my family don't have Amigas.
  31.  
  32.     ScionGenealogist is easy to use, comprehensive, and
  33.     provides Arexx ports for extracting data.
  34.  
  35.     An ARexx script can repeatedly and painlessly recreate Mosaic
  36.     .html files from entries in the ScionGenealogist data base.
  37.  
  38.     Mosaic is an available common method of presentation.
  39.  
  40.  
  41.  TESTED:    on Amiga3000 Kickstart v.37.175 Workbench v.38.35
  42.         &  Amiga3000 Kickstart v.40.68  Workbench v.40.42
  43.         w/ ScionGenealogist V 3.06 & Mosaic1.2beta_NoNet
  44.         w/ ScionGenealogist V 3.13 & Mosaic1.2_NoNet
  45.  
  46.         Mosaic .html file compatibility tested on Sun NCSA Mosaic
  47. -------------------------------README----------------------------------------
  48.   -----------------------------------------------------------------
  49.  | This Script is somewhat dependent on the following conventions  |
  50.  | that I followed in my ScionGenealogist data base:               |
  51.  |                                                                 |
  52.  | ·  lastnames are kept pure (no honorifics, Jr's, III's )        |
  53.  |                                                                 |
  54.  | ·  given names have any and all honorifics AFTER a COMMA        |
  55.  |                                                                 |
  56.  |  for example:  LastName      FirstNames, honorifics             |
  57.  |                                                                 |
  58.  |                BAUER-GAUSS   Joseph, Dr.                        |
  59.  |                DAGLEY        Richard Kelley, Jr.                |
  60.  |                                                                 |
  61.  |-----------------------------------------------------------------|
  62.  |                                                                 |
  63.  |  For a name change (NOT maidenname > marriedname), try this:    |
  64.  |                New           Birth Name > Changed To, Ph. D.    |
  65.  |     which lists as: Birth Name > Changed To New, Ph. D.         |
  66.  |                                                                 |
  67.   -----------------------------------------------------------------
  68. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  69. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  70. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  71. »«»«                                                                »«»«
  72. «»«» GetLastName: PROCEDURE at end of script capitalizes Last Names »«»«
  73. «»«» -------------------------------------------------------------  «»«»
  74. »«»« | it can also be used to handle "non-conforming" Last Names |  »«»«
  75. «»«» |                e.g. "MAC ISAAC" --> "MacISAAC"            |  «»«»
  76. »«»« |                     "VON NUEMANN" --> "VonNuemann"        |  »«»«
  77. «»«» -------------------------------------------------------------  «»«»
  78. »«»« BUT: you must add the additional tests yourself (it's easy!)   »«»«
  79. «»«»                                                                «»«»
  80. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  81. »«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«
  82. «»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»«»
  83.  |-----------------------------------------------------------------|
  84.  |                                                                 |
  85.  | ·  all dates are in the author's suggested form:  8 Jul 1939    |
  86.  |                                                                 |
  87.  |      ( not only is 7/8/39 ambigous, it will also break )        |
  88.  |      ( my .html file naming convention in a big way    )        |
  89.  |                                                                 |
  90.  | (   To any who may ask: it would be easy code around,         ) |
  91.  | (   but the form suggested by ScionGenealogist author         ) |
  92.  | (   Robbie J Akins makes much more sense to me!               ) |
  93.  |                                                                 |
  94.  | · if Death Date is blank; Death Place can be a COMMENT field    |
  95.  |                                            e.g. Phone #         |
  96.  | · if Burial Date is blank; Burial Place can be a COMMENT field  |
  97.  |                                            e.g. Address         |
  98.   -----------------------------------------------------------------
  99.  
  100.  * Running 'rx ScionToMosaic.rexx' gives further directions
  101.  
  102.  * Briefly, · start ScionGenealogist and load a data base
  103.  *          · 'assign Genealogy: '{Scion data base directory}
  104.  *          · start a Shell, cd to wherever you have or wish to have
  105.  *               the directory of Mosaic .html's
  106.  *          · 'rx ScionToMosaic.rexx Normal' to automagically create a 
  107.  *              Mosaic .html file for each person in your 
  108.  *              ScionGenealogist data base; following the TEMPLATE:
  109.  
  110. ############# begin genealogytemplate.html #########################
  111. <HTML>
  112. <TITLE>PERSON Data Sheet</TITLE>
  113. <H2>PERSON (PERSONGENDER) <A HREF="PERSONI.html"><I>more info</I></A> (()) 
  114. <A href="Genealogy/GenealogyFile.html"><B>List of persons.</B></A></H2>
  115. <H3>
  116. Born: BIRTHDATE * BIRTHPLACE <BR>
  117. Died: DEATHDATE + DEATHPLACE . Buried: BURIALPLACE <BR>
  118. </H3>
  119. <HR>            /* NEW FORMAT BELOW */
  120. <H3>Immediate Family of <I>PERSON</I></H3>
  121. <PRE><TT>
  122.   <A HREF="FATHER.html">FATHER</A>_//\_<A HREF="MOTHER.html">MOTHER</A> & MARRIAGEDATE @ MARRIAGEPLACE
  123.   |            <A HREF="Family#I.html"><I>family info</i></A>
  124.   |_____ <A HREF="Sibling1.html">Sibling1</A> (Sibling1GENDER) * Sibling1BIRTHDATE
  125.   |_____ <A HREF="SiblingN.html">SiblingN</A> (SiblingNGENDER) * SiblingNBIRTHDATE
  126.   |             
  127.   <B>PERSON</B>_//\_<A HREF="SPOUSE1.html">SPOUSE1</A> & MARRIAGE1DATE @ MARRIAGE1PLACE
  128.   |  |  |            <A HREF="Family#I.html"><I>family info</i></A>
  129.   |  |  |_____ <A HREF="mFGRn1c1.html">mFGRn1c1</A> (mFGRn1c1GENDER) * mFGRn1c1BIRTHDATE
  130.   |  |  |_____ <A HREF="mFGRn1cN.html">mFGRn1cN</A> (mFGRn1cNGENDER) * mFGRn1cNBIRTHDATE
  131.   |  |
  132.   |  |_//\_<A HREF="SPOUSE2.html">SPOUSE2</A> & MARRIAGE2DATE @ MARRIAGE2PLACE
  133.   |    |            <A HREF="Family#I.html"><I>family info</i></A>
  134.   |    |_____ <A HREF="mFGRn2c1.html">mFGRn2c1</A> (mFGRn2c1GENDER) * mFGRn2c1BIRTHDATE
  135.   |    |_____ <A HREF="mFGRn2cN.html">mFGRn2cN</A> (mFGRn2cNGENDER) * mFGRn2cNBIRTHDATE
  136.   |
  137.   |_//\_<A HREF="SPOUSEN.html">SPOUSEN</A> & MARRIAGENDATE @ MARRIAGENPLACE
  138.     |            <A HREF="Family#I.html"><I>family info</i></A>
  139.     |_____ <A HREF="mFGRnNc1.html">mFGRnNc1</A> (mFGRnNc1GENDER) * mFGRnNc1BIRTHDATE
  140.     |_____ <A HREF="mFGRnNcN.html">mFGRnNcN</A> (mFGRnNcNGENDER) * mFGRnNcNBIRTHDATE
  141. </TT><PRE>
  142. <HR>
  143. <H3>Ancestors of <I>PERSON</I></H3>
  144. <TT>
  145.           - <A HREF="GREATGRANDFATHER.html"><B>GREATGRANDFATHER</A> (FFF) * BIRTHDATE + DEATHDATE</B>
  146.       - <A HREF="GRANDFATHER.html"><B>GRANDFATHER</A> (FF) * BIRTHDATE + DEATHDATE</B>
  147.           - <A HREF="GREATGRANDMOTHER.html"><I>GREATGRANDMOTHER</A> (FFM) * BIRTHDATE + DEATHDATE</I>
  148.   - <A HREF="FATHER.html"><B>FATHER</A> (F) * BIRTHDATE + DEATHDATE</B>
  149.           - <A HREF="GREATGRANDFATHER.html"><B>GREATGRANDFATHER</A> (FMF) * BIRTHDATE + DEATHDATE</B>
  150.       - <A HREF="GRANDMOTHER.html"><I>GRANDMOTHER</A> (FM) * BIRTHDATE + DEATHDATE</I>
  151.           - <A HREF="GREATGRANDMOTHER.html"><I>GREATGRANDMOTHER</A> (FMM) * BIRTHDATE + DEATHDATE</I>
  152. <H2>PERSON * BIRTHDATE + DEATHDATE</H2>
  153.           - <A HREF="GREATGRANDFATHER.html"><B>GREATGRANDFATHER</A> (MFF) * BIRTHDATE + DEATHDATE</B>
  154.       - <A HREF="GRANDFATHER.html"><B>GRANDFATHER</A> (MF) * BIRTHDATE + DEATHDATE</B>
  155.           - <A HREF="GREATGRANDMOTHER.html"><I>GREATGRANDMOTHER</A> (MFM) * BIRTHDATE + DEATHDATE</I>
  156.   - <A HREF="MOTHER.html"><I>MOTHER</A> (M) * BIRTHDATE + DEATHDATE</I>
  157.           - <A HREF="GREATGRANDFATHER.html"><B>GREATGRANDFATHER</A> (MMF) * BIRTHDATE + DEATHDATE</B>
  158.       - <A HREF="GRANDMOTHER.html"><I>GRANDMOTHER</A> (MM) * BIRTHDATE + DEATHDATE</I>
  159.           - <A HREF="GREATGRANDMOTHER.html"><I>GREATGRANDMOTHER</A> (MMM) * BIRTHDATE + DEATHDATE</I>
  160. </TT></PRE>
  161. <HR>
  162. <H3>
  163.      a template to represent Genealogy data in Mosaic hypertext.<BR>
  164.  * replace all ocurrences of each appropriate ITEM with ACTUAL DATA<BR>
  165.      e.g. search-replace-all PERSON with: My Name<BR>
  166.      e.g. query-search-replace MOTHER with: My Mother's Name<BR>
  167.  * judiciously edit .html file names in anchors<BR>
  168.  * add/remove lines for children, siblings, spouses as necessary<BR>
  169. <BR>
  170. bugs: I'm assuming more than 8 char file names (works in UNIX & my Amiga)<BR>
  171. <BR>
  172. for discussion: how should files be named to uniquely identify individuals?<BR>
  173. <BR>
  174.                 e.g. I have at least 3 Franz Ruff's (uncle, grandF, great-grandF)<BR>
  175.                      these are most likely not other's Franz Ruff's<BR>
  176. <BR>
  177.                 if known, birth dates could be used: "Franz Ruff 18460521.html"<BR>
  178.                                or my preferred form: "FrRuff21May1846.html"<BR>
  179.                 ( this is working well in a REXX script I am generating )<BR>
  180.                 ( to translate my >400 person data base to Mosaic.html  )<BR>
  181.                 ( on an Amiga3000 from ScionGenealogist using ARexx     )<BR>
  182. <BR>
  183.                 even these may not be unique :(
  184. </H3>
  185. </HTML>
  186. ############### end genealogytemplate.html #####################################
  187.  
  188.  * In a Mosaic file (maybe HOME PAGE) have an anchor pointing to GenealogyFile:
  189.  
  190. <A href="file://localhost/Doc:Mosaic/DBNAMEGenealogy/GenealogyFile.html">
  191. Genealogy</A>
  192.  
  193. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  194. ^^ assumes you ran 'rx ScionToMosaic.rexx Normal' in directory: Doc:Mosaic ^^
  195. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  196.  
  197.  *       You might also create an {MyGenealogy}.html file yourself in directory
  198.  *       Doc:Mosaic/DBNAMEGenealogy as a starting point, with the anchor of
  199.  
  200. <A href="file://localhost/Doc:Mosaic/DBNAMEGenealogy/MyGenealogyFile.html">
  201. My Genealogy</A>
  202.  
  203.  e.g.:
  204. _____________________________________________________________
  205.  
  206. <TITLE>FirstName LastName Genealogy </TITLE>
  207. <H1>FirstName LastName Genealogy</H1>
  208. <HR>
  209. <A HREF="GenealogyFile.html">List of Persons.</A><P>
  210.  
  211. This is the genealogy of
  212. <A href="FiLast8Jul1939.html">FirstName LastName</A>.
  213. _____________________________________________________________
  214.          ^^^^^^^^^^^^^^
  215.  * Note the convention of first 2 characters from FirstName
  216.  *                        first 4 characters from LastName
  217.  *                        & BirthDate (with all blanks removed)
  218.  *
  219.  * If the BirthDate is not entered, the convention is:
  220.  *                        first 2 characters from FirstName
  221.  *                        first 6 characters from LastName
  222.  *                        & ScionGenealogist IRN
  223.  *
  224.  
  225.  * The PN{IRN}.DBNAME files are used to generate the "more info" files.
  226.  
  227.  * Whenever the PN{IRN}.DBNAME is changed or replaced, the corresponding
  228.  * "more info" file will be updated if 'rx ScionToMosaic.rexx {IRN}' is re-run.
  229.  
  230.  * TO DO: picture file anchors? PP{IRN}.DBNAME? ILBM not portable. Convert?
  231.  
  232. */
  233.  
  234. /* add libraries */
  235.         libs = 'rexxsupport.library rexxarplib.library'
  236.         DO i = 1 TO Words(libs)
  237.                 lib = Word(libs,i)
  238.                 IF ~Show('Lib',lib) THEN DO
  239.                         IF EXISTS('LIBS:'lib) then call addlib lib, 0, -30
  240.                         ELSE DO
  241.                                 'message "===> cannot find' lib 'in LIBS:"'
  242.                                 EXIT 10
  243.                         END
  244.                 END
  245.         END i
  246.  
  247. IF ~Show(p,'SCIONGEN') THEN DO
  248.     SAY ' '
  249.     SAY '    Cannot proceed because ScionGenealogist is NOT currently running:'
  250.     SAY ' '
  251.     SAY '    1. Please start ScionGenealogist and'
  252.     SAY ' '
  253.     SAY '    2. load the desired data base. Then:'
  254.     SAY ' '
  255.     SAY '    3. rx ScionToMosaic.rexx Normal'
  256.     SAY ' '
  257.     EXIT
  258.     END
  259.  
  260. Address "SCIONGEN"    /* Point at Scion Genealogist port */
  261. options RESULTS
  262.  
  263. 'GETDBNAME'        /* Issue GET DB NAME command to Scion Genealogist */
  264. DBNAME = RESULT
  265.  
  266. PARSE ARG target
  267. DO WHILE target = ""
  268.     SAY ' '
  269.     SAY ' Enter "Normal" to recreates all PERSON.html files; or'
  270.     SAY ' '
  271.     SAY ' a 'DBNAME' Scion data base "IRN" to recreate a specific PERSON.html file.'
  272.     SAY ' '
  273.     PULL target
  274. /*    EXIT    */
  275. /*    ELSE    target = Upper(target)    */
  276.  
  277. target = Upper(strip(target,,'"'))    /* just in case, remove errant quotes    */
  278. END
  279.  
  280. IF target = 'Q' | target = 'EXIT' | target = 'QUIT' THEN
  281.     EXIT
  282.  
  283. IF target = '?' | target = 'H' | target = 'HELP' THEN DO
  284.     SAY ' '
  285.     SAY '        please send comments, questions to:'
  286.     SAY ' '
  287.     SAY '            ipolyi@pat.mdc.com'
  288.     SAY '                or:'
  289.     SAY '            Harold H. Ipolyi '
  290.     SAY '             P.O.Box 891206 '
  291.     SAY '             Houston, Tx 77289-1206 '
  292.     SAY ' '
  293.     SAY ' /¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯\'
  294.     SAY '   Convert ScionGenealogist data base to Mosaic .html hypertext.  '
  295.     SAY ' \_______________________________________________________________/'
  296.     SAY ' '
  297.     SAY ' Usage: rx ScionToMosaic.rexx Normal {recreates all PERSON.html files}'
  298.     SAY '        rx ScionToMosaic.rexx IRN    {recreates a specific PERSON.html file}'
  299.     SAY ' '
  300.     EXIT
  301.     END    
  302.  
  303. IF target = 'N' THEN
  304.     target = 'NORMAL'
  305. IF target = 'T' THEN
  306.     target = 'TEST'
  307.  
  308. /*    SAY target    */
  309.  
  310. 'GETPROGVERSION'
  311. VERSION = RESULT
  312.  
  313. IF VERSION < 3.13 THEN DO
  314.     SAY ' '
  315.     say ' Requires VERSION = 3.13 or greater'
  316.     SAY ' '
  317.     EXIT
  318.     END
  319.             /* ??? GETDBDIRPATH ??? of Scion data base */
  320.  
  321. SAY ' '
  322. Say ' Testing: is data base assignment of Genealogy:'DBNAME' visible?'
  323. SAY ' '
  324.  
  325. PRAGMA('w','n')
  326. IF ~Exists("Genealogy:"DBNAME) THEN DO
  327.     SAY '     Genealogy:'DBNAME' not found,'
  328.     SAY ' '
  329.     SAY "     Please create an assign to data base "DBNAME"'s directory:"
  330.     SAY ' '
  331.     SAY ' assign Genealogy: {Volume:Directory}'
  332.     SAY ' '
  333.     EXIT
  334.     END
  335. PRAGMA('w','w')
  336.  
  337. Gdir = DBNAME'Genealogy'
  338. Tdir = DBNAME'Text'
  339.  
  340. IF ~Makedir(Gdir) THEN DO
  341.     SAY ' '
  342.     SAY ' ===> unable to create directory: 'Gdir
  343.     SAY ' '
  344.     EXIT
  345.     END
  346.  
  347. IF ~Makedir(Tdir) THEN DO
  348.     SAY ' '
  349.     SAY ' ===> unable to create directory: 'Tdir
  350.     SAY ' '
  351.     EXIT
  352.     END
  353.  
  354.  
  355. 'GETTOTALIRN'        /* Issue command to Scion Genealogist */
  356.     TOTALIRN = RESULT
  357.  
  358. Say "Number of people in database " DBNAME " = " TOTALIRN
  359. SAY ' '
  360.  
  361. 'GETPERSLABEL' 1
  362. PERSLABEL1 = RESULT
  363. 'GETPERSLABEL' 2
  364. PERSLABEL2 = RESULT
  365. 'GETPERSLABEL' 3
  366. PERSLABEL3 = RESULT
  367. 'GETFAMLABEL' 1
  368. FAMLABEL1 = RESULT
  369. 'GETFAMLABEL' 2
  370. FAMLABEL2 = RESULT
  371. IF IsNumeric(target) THEN
  372.     DO
  373.     Say 'Processing person ' target ' of ' TOTALIRN ' in database ' DBNAME
  374.  
  375.     IF target <= TOTALIRN THEN DO
  376. /*        Open('GenealogyText',Tdir'/GenealogyOf'target,'w')    */
  377.         Open('GenealogyText',Tdir'/G'target,'w')
  378.         CALL MakeOne(target)
  379.         Close('GenealogyText')
  380.         END
  381.     END
  382. ELSE
  383.     DO
  384.     target = Upper(target)
  385.     IF target = "TEST" THEN DO
  386.  
  387.         DO i = 1 TO 7
  388. /*        Open('GenealogyText',Tdir'/GenealogyOf'i,'w')    */
  389.         Open('GenealogyText',Tdir'/G'i,'w')
  390.         CALL MakeOne(i)
  391.         Close('GenealogyText')
  392.             END
  393.         END
  394.     ELSE
  395.         DO
  396.         Say "Processing all " TOTALIRN " persons in database " DBNAME
  397.  
  398. /* GenealogyFile.html is a Scion data base IRN order list of all persons in 
  399.    Mosaic .html format, format:
  400.  
  401.    person * birthdate + deathdate (()) father //\ mother    */
  402.  
  403. Say 'Mosaic file name: 'Gdir'/GenealogyFile.html for: List of Persons.'
  404.  
  405.         Open('GenealogyFile',Gdir'/GenealogyFile.html','w')
  406.         WriteLn('GenealogyFile','<HTML>')
  407.         WriteLn('GenealogyFile','<TITLE>List of Persons.</TITLE>')
  408. WriteLn('GenealogyFile','<H2>List of Persons in data base "'DBNAME'". <B>'Time()' - 'Date()'</B></H2>')
  409.         WriteLn('GenealogyFile','<H3>')
  410.  
  411.         Open('GenealogyText',Tdir'/GenealogyOf'DBNAME,'w')
  412.         WriteLn('GenealogyText','Genealogy Data Base "'GetLastName(DBNAME)'"')
  413.         WriteLn('GenealogyText','')
  414.         WriteLn('GenealogyText','-----------------------------------------------------------')
  415.         WriteLn('GenealogyText','')
  416.  
  417.         DO i = 1 TO TOTALIRN
  418.             CALL MakeOne(i)
  419.             END
  420.         WriteLn('GenealogyFile','</H3>')
  421.         WriteLn('GenealogyFile','<HR>')
  422.         WriteLn('GenealogyFile','<Address>')
  423.         'GETPROGVERSION'
  424.         VERSION = RESULT
  425.         WriteCh('GenealogyFile','<H3>ScionGenealogist')
  426.         IF VERSION > 0 THEN WriteCh('GenealogyFile',' V 'VERSION)
  427.         WriteLn('GenealogyFile',' © Robbie J Akins; ')
  428.         WriteLn('GenealogyFile','Scion'VERSION'ToMosaic.rexx © Harold Ipolyi</H3>')
  429.         WriteLn('GenealogyFile','</Address>')
  430.         WriteLn('GenealogyFile','</HTML>')
  431.         END
  432. Say ' '
  433. ThisPath = PRAGMA('d')
  434. IF Substr(ThisPath,Length(ThisPath),Length(ThisPath)) ~= ":" THEN ThisPath = ThisPath'/'
  435. Say ' ---------------------------------------------------------------------'
  436. Say ' If you have not already done so, add the following anchor pointing to'
  437. Say ' "'GetLastName(DBNAME)' Genealogy" to a Mosaic file (maybe HOME PAGE):'
  438. Say ' ---------------------------------------------------------------------'
  439. Say ' <A href="/'ThisPath||Gdir'/GenealogyFile.html">'GetLastName(DBNAME)' Genealogy</A>'
  440. Say ' ------------------------------------------------------------------'
  441.     END
  442. SAY ' '
  443. Say 'ScionToMosaic.rexx completed normally'
  444. EXIT
  445.  
  446. /*************************************************************************/
  447.  
  448. MakeOne: PROCEDURE EXPOSE target DBNAME Gdir Tdir FAMLABEL1 FAMLABEL2 PERSLABEL1 PERSLABEL2 PERSLABEL3
  449.     PARSE ARG ScionIRN
  450. 'EXISTPERSON' ScionIRN
  451. /**/
  452. if RESULT = 'YES' THEN DO
  453. /**/
  454.     HasFileFATHER = 0
  455.     HasFileMOTHER = 0
  456.     HasMOTHER = 0
  457.     HasFATHER = 0
  458.     HasPARENTS = 0
  459.     HasCHILDREN = 0
  460.     DoGenText = 0
  461.     'GETPARENTS' ScionIRN
  462.     PARENTS = RESULT
  463.         tPARENTSt = 't'PARENTS't'
  464. /*    Say 'PARENTS = 'PARENTS tPARENTSt    ??? EXISTPARENTS IRN ???    */
  465.     IF tPARENTSt ~= 'tt' THEN HasPARENTS = 1
  466.     'GETMARRIAGE' ScionIRN 0    /*      ??? GETTOTMARRIAGES IRN ???     */
  467.     MARRIAGE = RESULT
  468.     tMARRIAGESt = 't'MARRIAGE't'
  469. /*    Say 'MARRIAGES = 'MARRIAGE tMARRIAGESt        */
  470.     IF tMARRIAGESt ~= 'tMARRIAGEt' THEN DO
  471.         mFGRN = MARRIAGE
  472.         'GETCHILD' mFGRN 0    /*    ??? GETTOTCHILDREN FGRN ???    */
  473.         'EXISTPERSON' RESULT
  474.         if RESULT = 'YES' then HasCHILDREN = 1        
  475.     END
  476. /*
  477. Say 'PARENTS = 'PARENTS tPARENTSt 'MARRIAGES = 'MARRIAGES tMARRIAGESt 'HasPARENTS = 'HasPARENTS 'HasCHILDREN = 'HasCHILDREN
  478. */
  479.     IF ( HasPARENTS + HasCHILDREN ) = 1 THEN DoGenText = 1
  480. /**/
  481.     'GETLASTNAME' ScionIRN
  482.     LASTNAME = GetLastName(RESULT)
  483.     'GETFIRSTNAME' ScionIRN
  484.     FIRSTNAME = RESULT
  485.     'GETSEX' ScionIRN
  486.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  487.     thelastname = LASTNAME
  488.     thegender = GENDER
  489.     FULLNAME = GetFullName(FIRSTNAME)
  490.     MFULLNAME = MGetFullName(FIRSTNAME)
  491.     PFULLNAME = PGetFullName(FIRSTNAME)
  492.     'GETBIRTHDATE' ScionIRN
  493.     BIRTHDATE = RESULT
  494.     'GETBIRTHPLACE' ScionIRN
  495.     BIRTHPLACE = RESULT
  496.     'GETDEATHDATE' ScionIRN
  497.     DEATHDATE = RESULT
  498.     'GETDEATHPLACE' ScionIRN
  499.     DEATHPLACE = RESULT
  500.     'GETBURIALPLACE' ScionIRN
  501.     BURIALPLACE = RESULT
  502.     'GETPERSUSER1' ScionIRN
  503.     PERSUSER1 = CheckForReplacement(RESULT)
  504.     PERSUSERn1 = CheckForNAReplacement(RESULT)
  505.     'GETPERSUSER2' ScionIRN
  506.     PERSUSER2 = CheckForReplacement(RESULT)
  507.     PERSUSERn2 = CheckForNAReplacement(RESULT)
  508.     'GETPERSUSER3' ScionIRN
  509.     PERSUSER3 = CheckForReplacement(RESULT)
  510.     PERSUSERn3 = CheckForNAReplacement(RESULT)
  511. IF target ~= "NORMAL" | BIRTHPLACE ~= "" | DEATHPLACE ~= "" | BURIALPLACE ~= "" | PERSUSER1 ~= "" | PERSUSER2 ~= "" | PERSUSER3 ~= "" THEN DoGenText = 1
  512. /**/
  513.     IF LASTNAME = "" THEN DO
  514. Say "Person " ScionIRN"'s last name is not defined; no new Mosaic file being created!"
  515.         RETURN
  516.         END
  517.     IF BIRTHDATE = "" THEN
  518.         PERSONFILENAME = Space(substr(FIRSTNAME,1,2) substr(LASTNAME,1,6) ScionIRN)
  519.     ELSE
  520.         PERSONFILENAME = Space(substr(FIRSTNAME,1,2) substr(LASTNAME,1,4) BIRTHDATE)
  521. /**/
  522.     PfilN = Gdir'/'PERSONFILENAME
  523.     Say ''
  524.     Say 'Mosaic file: 'PfilN'.html for: 'FULLNAME' {'ScionIRN'}'
  525.     Open('PERSONFILE',PfilN'.html','w')
  526.     WriteLn('PERSONFILE','<HTML>')
  527.     WriteLn('PERSONFILE','<TITLE>'FULLNAME' Data Sheet</TITLE>')
  528.     WriteCh('PERSONFILE','<H2>'MFULLNAME)
  529. /**/
  530.     IF Exists('Genealogy:PN'ScionIRN'.'DBNAME) THEN DO
  531.         Say 'Writing info file 'PfilN'I.html'
  532.         Open('PNDBNAME','Genealogy:PN'ScionIRN'.'DBNAME,'r')
  533.         Open('PERSONI',PfilN'I.html','w')
  534.         WriteLn('PERSONI','<HTML>')
  535.         WriteLn('PERSONI','<TITLE>'FULLNAME' Information</TITLE>')
  536.         WriteCh('PERSONI','<H2><A HREF="'PERSONFILENAME'.html">'MFULLNAME)
  537.         WriteCh('PERSONI','</A> Information. <A HREF="GenealogyFile.html">')
  538.         WriteLn('PERSONI','<B>List of Persons.</B></A></H2><PRE><TT>')
  539.         IF DoGenText THEN WriteLn('GenealogyText',PFULLNAME' Information.')
  540.         DO While ~EOF('PNDBNAME')
  541.             line = ReadLn('PNDBNAME')
  542.             WriteLn('PERSONI',CheckForReplacement(line))
  543.             IF DoGenText THEN WriteLn('GenealogyText',CheckForNAReplacement(line))
  544.             END
  545.         Close('PNDBNAME')
  546.         IF DoGenText THEN WriteLn('GenealogyText',' ')
  547.         WriteLn('PERSONI','</HTML>')
  548.         Close('PERSONI')
  549. WriteCh('PERSONFILE',' (<A HREF="'PERSONFILENAME'I.html"><B>more info</B></A>)')
  550.         END
  551. /**/
  552.     WriteLn('PERSONFILE',' <A HREF="GenealogyFile.html"><B>List of Persons.</B></A></H2><H3>')
  553.     IF DoGenText THEN DO
  554. /*        IF target ~= "NORMAL" THEN Say 'Printable file: 'Tdir'/GenealogyOf'ScionIRN' for 'FULLNAME' {'ScionIRN'}'    */
  555.         IF target ~= "NORMAL" THEN Say 'Printable file: 'Tdir'/G'ScionIRN' for 'FULLNAME' {'ScionIRN'}'
  556.         WriteLn('GenealogyText','')
  557.         WriteLn('GenealogyText','-----------------------------------------------------------')
  558.         WriteLn('GenealogyText','')
  559.         WriteLn('GenealogyText',PFULLNAME' Data Sheet')
  560.         END
  561.     IF BIRTHDATE || BIRTHPLACE ~= "" THEN DO
  562.         WriteCh('PERSONFILE','Born: ')
  563.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',BIRTHDATE)
  564.         IF BIRTHPLACE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHPLACE)
  565.         WriteLn('PERSONFILE','<BR>')
  566.         IF BIRTHDATE ~= "" THEN IF DoGenText THEN WriteCh('GenealogyText','Born: 'BIRTHDATE)
  567.         IF BIRTHPLACE ~= "" THEN IF DoGenText THEN WriteCh('GenealogyText',' * 'BIRTHPLACE)
  568.         IF DoGenText THEN WriteLn('GenealogyText','')
  569.         END
  570.     IF DEATHDATE ~= "" THEN    DO
  571.         WriteCh('PERSONFILE','Died: 'DEATHDATE' + 'DEATHPLACE)
  572.         IF DoGenText THEN WriteCh('GenealogyText','Died: 'DEATHDATE' + 'DEATHPLACE)
  573.         IF BURIALPLACE ~= "" THEN DO
  574.             WriteCh('PERSONFILE',' . Buried: 'BURIALPLACE)
  575.             IF DoGenText THEN WriteCh('GenealogyText',' . Buried: 'BURIALPLACE)
  576.             END
  577.         WriteLn('PERSONFILE','<BR>')
  578.         IF DoGenText THEN WriteLn('GenealogyText','')
  579.         END
  580.     ELSE DO
  581.         IF DEATHPLACE ~= "" THEN DO
  582.             WriteLn('PERSONFILE',DEATHPLACE'<BR>')
  583.             IF DoGenText THEN WriteLn('GenealogyText',DEATHPLACE)
  584.             END
  585.         IF BURIALPLACE ~= "" THEN DO
  586.             WriteLn('PERSONFILE',BURIALPLACE'<BR>')
  587.             IF DoGenText THEN WriteLn('GenealogyText',BURIALPLACE)
  588.             END
  589.         END
  590.     IF PERSUSER1 ~= "" THEN DO
  591.         WriteLn('PERSONFILE',PERSLABEL1': 'PERSUSER1'<BR>')
  592.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL1': 'PERSUSERn1)
  593.         END
  594.     IF PERSUSER2 ~= "" THEN DO
  595.         WriteLn('PERSONFILE',PERSLABEL2': 'PERSUSER2'<BR>')
  596.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL2': 'PERSUSERn2)
  597.         END
  598.     IF PERSUSER3 ~= "" THEN DO
  599.         WriteLn('PERSONFILE',PERSLABEL3': 'PERSUSER3'<BR>')
  600.         IF DoGenText THEN WriteLn('GenealogyText',PERSLABEL3': 'PERSUSERn3)
  601.         END
  602.  
  603. /* end of personal data; start family tree segment */
  604.  
  605.     WriteLn('PERSONFILE','<HR>')
  606.     IF DoGenText THEN DO
  607.         WriteLn('GenealogyText','')
  608.         WriteLn('GenealogyText','-----------------------------------------------------------')
  609.         WriteLn('GenealogyText','')
  610.         END
  611.     WriteCh('PERSONFILE','<H3>Immediate Family of 'MFULLNAME'</H3>')
  612.     IF DoGenText THEN DO
  613.         WriteLn('GenealogyText','Immediate Family of 'PFULLNAME)
  614.         WriteLn('GenealogyText','')
  615.         END
  616.     WriteLn('PERSONFILE','<PRE><TT>')
  617. /**/
  618.     IF HasPARENTS THEN DO
  619.         'GETPRINCIPAL' PARENTS
  620.         PRINCIPAL = RESULT
  621.         'GETSPOUSE' PARENTS
  622.         SPOUSE = RESULT
  623.         'GETMARRYDATE' PARENTS
  624.         PARENTSMARRIAGEDATE = RESULT
  625.         'GETMARRYPLACE' PARENTS
  626.         PARENTSmFGRNPLACE = RESULT
  627.         'GETFAMUSER1' PARENTS
  628.         PARENTSmFGRNCELEBRANT = CheckForReplacement(RESULT)
  629.         PARENTSnmFGRNCELEBRANT = CheckForNAReplacement(RESULT)
  630.         'GETFAMUSER2' PARENTS
  631.         PARENTSmFGRNCOMMENT = CheckForReplacement(RESULT)
  632.         PARENTSnmFGRNCOMMENT = CheckForNAReplacement(RESULT)
  633.         'GETSEX' PRINCIPAL
  634.         IF RESULT = 'M' THEN
  635.             DO
  636.             FATHERScionIRN = PRINCIPAL
  637.             MOTHERScionIRN = SPOUSE
  638.             END
  639.         ELSE
  640.             DO
  641.             FATHERScionIRN = SPOUSE
  642.             MOTHERScionIRN = PRINCIPAL
  643.             END
  644.         'GETLASTNAME' FATHERScionIRN
  645.         FATHERLASTNAME = GetLastName(RESULT)
  646.         'GETFIRSTNAME' FATHERScionIRN
  647.         FATHERFIRSTNAME = RESULT
  648.         IF FATHERFIRSTNAME ~= "" | FATHERLASTNAME ~= "" THEN HasFATHER = 1
  649.         thelastname = FATHERLASTNAME
  650.         thegender = "m"
  651. FATHERFULLNAME = GetFullName(FATHERFIRSTNAME)
  652. MFATHERFULLNAME = MGetFullName(FATHERFIRSTNAME)
  653. PFATHERFULLNAME = PGetFullName(FATHERFIRSTNAME)
  654.         'GETBIRTHDATE' FATHERScionIRN
  655.         FATHERBIRTHDATE = RESULT
  656.         'GETLASTNAME' MOTHERScionIRN
  657.         MOTHERLASTNAME = GetLastName(RESULT)
  658.         'GETFIRSTNAME' MOTHERScionIRN
  659.         MOTHERFIRSTNAME = RESULT
  660.         IF MOTHERFIRSTNAME ~= "" | MOTHERLASTNAME ~= "" THEN HasMOTHER = 1
  661.         thelastname = MOTHERLASTNAME
  662.         thegender = "f"
  663. MOTHERFULLNAME = GetFullName(MOTHERFIRSTNAME)
  664. MMOTHERFULLNAME = MGetFullName(MOTHERFIRSTNAME)
  665. PMOTHERFULLNAME = PGetFullName(MOTHERFIRSTNAME)
  666.         'GETBIRTHDATE' MOTHERScionIRN
  667.         MOTHERBIRTHDATE = RESULT
  668. /**/
  669.         IF FATHERLASTNAME ~= "" THEN DO
  670.             HasFileFATHER = 1
  671.             IF FATHERBIRTHDATE = "" THEN DO
  672. FATHERFILENAME = Space(substr(FATHERFIRSTNAME,1,2) substr(FATHERLASTNAME,1,6) FATHERScionIRN)
  673.                 END
  674.             ELSE DO
  675. FATHERFILENAME = Space(substr(FATHERFIRSTNAME,1,2) substr(FATHERLASTNAME,1,4) FATHERBIRTHDATE)
  676.                 END        
  677.             END        
  678. /**/
  679.         IF MOTHERLASTNAME ~= "" THEN DO
  680.             HasFileMOTHER = 1
  681.             IF MOTHERBIRTHDATE = "" THEN DO
  682. MOTHERFILENAME = Space(substr(MOTHERFIRSTNAME,1,2) substr(MOTHERLASTNAME,1,6) MOTHERScionIRN)
  683.                 END
  684.             ELSE DO
  685. MOTHERFILENAME = Space(substr(MOTHERFIRSTNAME,1,2) substr(MOTHERLASTNAME,1,4) MOTHERBIRTHDATE)
  686.                 END
  687.             END        
  688. /**/
  689.         WriteCh('PERSONFILE','  ')
  690.         IF HasFileFATHER THEN WriteCh('PERSONFILE','<A HREF="'FATHERFILENAME'.html">')
  691.         WriteCh('PERSONFILE',MFATHERFULLNAME)
  692.         IF HasFileFATHER THEN WriteCh('PERSONFILE','</A> //\ ')
  693.         IF HasFileMOTHER THEN WriteCh('PERSONFILE','<A HREF="'MOTHERFILENAME'.html">')
  694.         WriteCh('PERSONFILE',MMOTHERFULLNAME)
  695.         IF HasFileMOTHER THEN WriteCh('PERSONFILE','</A>')
  696. /**/
  697.         IF PARENTSMARRIAGEDATE ~= "" THEN
  698. WriteCh('PERSONFILE',' & 'PARENTSMARRIAGEDATE)
  699.         IF PARENTSmFGRNPLACE ~= "" THEN
  700. WriteCh('PERSONFILE',' @ 'PARENTSmFGRNPLACE)
  701. /**/
  702.         WriteLn('PERSONFILE','')
  703.         IF DoGenText THEN DO
  704.             WriteCh('GenealogyText','  'PFATHERFULLNAME' //\ 'PMOTHERFULLNAME)
  705.     IF PARENTSMARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'PARENTSMARRIAGEDATE)
  706.     IF PARENTSmFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'PARENTSmFGRNPLACE)
  707.             WriteLn('GenealogyText','')
  708.             END
  709.         spcs = '  |'
  710.         DO i = 0 TO Length(FATHERFULLNAME)
  711.             spcs = spcs' '        /*    ??? GETFAMLBL1 ???    */
  712.         END                /*    ??? GETFAMLBL2 ???    */
  713. /**/
  714.     FfilN = Gdir'/Family'PARENTS
  715.     IF Exists(FfilN'I.html') THEN DO
  716.         IF Exists('Genealogy:FN'PARENTS'.'DBNAME) THEN DO
  717. Parse value StateF(FfilN'I.html') with type size blk bits PFday PFmin PFtick com
  718. Parse value StateF('Genealogy:FN'PARENTS'.'DBNAME) with type size blk bits PNday PNmin PNtick com
  719. /* Say PERSONFILENAME'I.html' PFday PFmin PFtick  'Genealogy:FN'PARENTS'.'DBNAME PNday PNmin PNtick */
  720.             IF ( PNday > PFday ) | ( PNday = PFday & PNmin > PFmin ) THEN DO
  721.                 Delete(FfilN'I.html')
  722. Say 'Scion file Genealogy:FN'PARENTS'.'DBNAME 'newer; replacing 'FfilN'I.html'
  723.                 END
  724.             END
  725.         END
  726. /**/
  727.         Minfo = 0
  728.     IF Exists(FfilN'I.html') THEN
  729.         Minfo = 1
  730. /*    WriteCh('PERSONFILE',' (<A HREF="'PERSONFILENAME'I.html"><B>more info</B></A>)')    */
  731.     ELSE DO
  732.         IF Exists('Genealogy:FN'PARENTS'.'DBNAME) THEN DO
  733.             Minfo = 1
  734.             Say 'Writing info file 'FfilN'I.html'
  735.             Open('FNDBNAME','Genealogy:FN'PARENTS'.'DBNAME,'r')
  736.             Open('FAMILYI',FfilN'I.html','w')
  737.     WriteLn('FAMILYI','<HTML>')
  738.     WriteLn('FAMILYI','<TITLE>'FATHERFULLNAME' Family Information</TITLE>')
  739.     WriteCh('FAMILYI','<H2><A HREF="GenealogyFile.html">')
  740.     WriteLn('FAMILYI','<B>List of Persons.</B></A></H2><PRE><TT>')
  741.             DO While ~EOF('FNDBNAME')
  742.                 line = ReadLn('FNDBNAME')
  743.                 WriteLn('FAMILYI',line)
  744.             END
  745.             Close('FNDBNAME')
  746.             WriteLn('FAMILYI','</HTML>')
  747.             Close('FAMILYI')
  748. /*    WriteCh('PERSONFILE',' (<A HREF="'PERSONFILENAME'I.html"><B>more info</B></A>)')    */
  749.             END
  750.         END
  751. /**/
  752.     IF PARENTSmFGRNCELEBRANT ~= '' | Minfo THEN DO
  753.         WriteCh('PERSONFILE',spcs)
  754.         IF Minfo THEN
  755.             WriteCh('PERSONFILE','(<A HREF="Family'PARENTS'I.html"><B>family info</B></A>) ')
  756.         IF PARENTSmFGRNCELEBRANT ~= '' THEN DO
  757.             WriteCh('PERSONFILE',FAMLABEL1': 'PARENTSmFGRNCELEBRANT)
  758.             IF DoGenText THEN WriteLn('GenealogyText',spcs||FAMLABEL1': 'PARENTSnmFGRNCELEBRANT)
  759.             END
  760.         WriteLn('PERSONFILE','')
  761.         END
  762. IF PARENTSmFGRNCOMMENT ~= '' THEN DO
  763.     WriteLn('PERSONFILE',spcs' 'FAMLABEL2': 'PARENTSmFGRNCOMMENT)
  764.     IF DoGenText THEN WriteLn('GenealogyText',spcs' 'FAMLABEL2': 'PARENTSnmFGRNCOMMENT)
  765.         END
  766.         DO i = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */
  767.             'GETCHILD' PARENTS i
  768.             PARENTSc = RESULT
  769.             'GETFIRSTNAME' PARENTSc
  770.             PARENTScFIRSTNAME = RESULT
  771. /**/
  772.             IF PARENTScFIRSTNAME ~= "" THEN DO
  773.                 IF PARENTSc ~= ScionIRN THEN DO
  774.                     'GETLASTNAME' PARENTSc
  775.                     PARENTScLASTNAME = GetLastName(RESULT)
  776.                     'GETFIRSTNAME' PARENTSc
  777.                     PARENTScFIRSTNAME = RESULT
  778.                     'GETSEX' PARENTSc
  779. PARENTScGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  780.                     thelastname = PARENTScLASTNAME
  781.                     thegender = PARENTScGENDER
  782. PARENTScFULLNAME = GetFullName(PARENTScFIRSTNAME)
  783. MPARENTScFULLNAME = MGetFullName(PARENTScFIRSTNAME)
  784. PPARENTScFULLNAME = PGetFullName(PARENTScFIRSTNAME)
  785.                     'GETBIRTHDATE' PARENTSc
  786.                     PARENTScBIRTHDATE = RESULT
  787.                     'GETDEATHDATE' PARENTSc
  788.                     PARENTScDEATHDATE = RESULT
  789. /**/
  790.                     IF PARENTScBIRTHDATE = "" THEN
  791. PARENTScFILENAME = Space(substr(PARENTScFIRSTNAME,1,2) substr(PARENTScLASTNAME,1,6) PARENTSc)
  792.                     ELSE
  793. PARENTScFILENAME = Space(substr(PARENTScFIRSTNAME,1,2) substr(PARENTScLASTNAME,1,4) PARENTScBIRTHDATE)
  794. /**/
  795. WriteCh('PERSONFILE','  |_____ <A HREF="'PARENTScFILENAME'.html">')
  796. /**/
  797.                     IF PARENTScLASTNAME ~= FATHERLASTNAME THEN
  798. WriteCh('PERSONFILE',MPARENTScFULLNAME)
  799.                     ELSE DO
  800. IF PARENTScGENDER = "m" THEN WriteCh('PERSONFILE','<B>'PARENTScFIRSTNAME'</B>')
  801. IF PARENTScGENDER = "f" THEN WriteCh('PERSONFILE','<I>'PARENTScFIRSTNAME'</I>')
  802.                         END
  803. /**/
  804. WriteCh('PERSONFILE','</A> ')
  805. /**/
  806.                     IF PARENTScBIRTHDATE ~= "" THEN
  807. WriteCh('PERSONFILE','   * 'PARENTScBIRTHDATE)
  808. /**/
  809.                     IF PARENTScDEATHDATE ~= "" THEN
  810. WriteCh('PERSONFILE','   + 'PARENTScDEATHDATE)
  811. /**/
  812. WriteLn('PERSONFILE','')
  813. IF DoGenText THEN DO
  814.     WriteCh('GenealogyText','  |_____  'PPARENTScFULLNAME)
  815. IF PARENTScBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'PARENTScBIRTHDATE)
  816. IF PARENTScDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'PARENTScDEATHDATE)
  817. WriteLn('GenealogyText','')
  818.     END
  819.                     END
  820.                 END
  821.             END
  822.         END
  823.     END
  824.  
  825. /* end of parents, siblings segment; start marriages segment */
  826.  
  827.         vert.0 = ''
  828.         vert.1 = ' |'
  829.         DO i = 0 TO 39                  /*      ??? GETTOTMARRIAGES IRN ???     */
  830.                 'GETMARRIAGE' ScionIRN i
  831.                 MARRIAGE = RESULT               /* use: 'EXISTFAMILY'   */
  832.                 IF MARRIAGE > -1 THEN DO
  833.                         MARRIAGES = i
  834.                         j = i + 1
  835.                         vert.j = vert.i vert.1
  836.                         END
  837.         END
  838.         tMARRIAGESt = 't'MARRIAGES't'
  839. /*    Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt    */
  840.  
  841.     IF tMARRIAGESt ~= 'tMARRIAGESt' THEN DO
  842.         WriteLn('PERSONFILE','  |')
  843.         IF DoGenText THEN WriteLn('GenealogyText','  |')
  844.         DO i = 0 TO MARRIAGES
  845.             'GETMARRIAGE' ScionIRN i
  846.             mFGRN = RESULT
  847.             IF mFGRN ~= "" THEN DO
  848.                 ki = MARRIAGES - i + 1
  849.                 IF ki ~= MARRIAGES + 1 THEN DO
  850.                     WriteLn('PERSONFILE',vert.ki)
  851.                     IF DoGenText THEN WriteLn('GenealogyText',vert.ki)
  852.                     END
  853.                 j = MARRIAGES + 1 - i
  854.                 'GETSPOUSE' mFGRN
  855.                 SPOUSE = RESULT
  856.                 IF SPOUSE = ScionIRN THEN
  857.                     DO
  858.                     'GETPRINCIPAL' mFGRN
  859.                     SPOUSE = RESULT
  860.                     END
  861.                 'GETLASTNAME' SPOUSE
  862.                 SPOUSELASTNAME = GetLastName(RESULT)
  863.                 'GETFIRSTNAME' SPOUSE
  864.                 SPOUSEFIRSTNAME = RESULT
  865.                 thelastname = SPOUSELASTNAME
  866.                 'GETSEX' SPOUSE
  867.                 thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  868. SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  869. MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  870. PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  871.                 'GETBIRTHDATE' SPOUSE
  872.                 SPOUSEBIRTHDATE = RESULT
  873.                 'GETMARRYDATE' mFGRN
  874.                 MARRIAGEDATE = RESULT
  875.                 'GETMARRYPLACE' mFGRN
  876.                 mFGRNPLACE = RESULT
  877.                 'GETFAMUSER1' mFGRN
  878.                 MARRIAGECELEBRANT = CheckForReplacement(RESULT)
  879.                 MARRIAGEnCELEBRANT = CheckForNAReplacement(RESULT)
  880.                 'GETFAMUSER2' mFGRN
  881.                 MARRIAGECOMMENT = CheckForReplacement(RESULT)
  882.                 MARRIAGEnCOMMENT = CheckForNAReplacement(RESULT)
  883. /**/
  884.                 IF SPOUSEBIRTHDATE = "" THEN
  885. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,6) SPOUSE)
  886.                 ELSE
  887. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,4) SPOUSEBIRTHDATE)
  888. /**/
  889.                 IF i = 0 THEN DO
  890. WriteCh('PERSONFILE','  'MFULLNAME' //\ ')
  891.  
  892.                     IF SPOUSELASTNAME ~= "" THEN
  893. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')
  894.  
  895. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  896.  
  897.                     IF SPOUSELASTNAME ~= "" THEN
  898. WriteCh('PERSONFILE','</A>')
  899.  
  900. IF DoGenText THEN DO
  901.     WriteCh('GenealogyText','  'PFULLNAME' //\ 'PSPOUSEFULLNAME)
  902.     IF MARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'MARRIAGEDATE)
  903.     IF mFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'mFGRNPLACE)
  904.     WriteLn('GenealogyText','')
  905.     END
  906.                     END
  907.  
  908.                 ELSE DO
  909. WriteCh('PERSONFILE',vert.j'_ //\ ')
  910.  
  911.                     IF SPOUSELASTNAME ~= "" THEN
  912. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')
  913.  
  914. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  915.  
  916.                     IF SPOUSELASTNAME ~= "" THEN
  917. WriteCh('PERSONFILE','</A>')
  918.  
  919. IF DoGenText THEN DO
  920.     WriteCh('GenealogyText',vert.j'_ //\ 'PSPOUSEFULLNAME)
  921.     IF MARRIAGEDATE ~= "" THEN WriteCh('GenealogyText',' & 'MARRIAGEDATE)
  922.     IF mFGRNPLACE ~= "" THEN WriteCh('GenealogyText',' @ 'mFGRNPLACE)
  923.     WriteLn('GenealogyText','')
  924.     END
  925.                     END
  926.  
  927.                 IF MARRIAGEDATE ~= "" THEN
  928. WriteCh('PERSONFILE',' & 'MARRIAGEDATE)
  929.                 IF mFGRNPLACE ~= "" THEN
  930. WriteCh('PERSONFILE',' @ 'mFGRNPLACE)
  931.  
  932.                 WriteLn('PERSONFILE','')
  933.                 jk = MARRIAGES - i
  934.                 spcs = vert.jk'      |     '
  935. /**/
  936.                 FfilN = Gdir'/Family'mFGRN
  937.                 Minfo = 0
  938.                 IF Exists('Genealogy:FN'mFGRN'.'DBNAME) THEN DO
  939.                     Minfo = 1
  940.                     Say 'Writing info file 'FfilN'I.html'
  941.                     Open('FNDBNAME','Genealogy:FN'mFGRN'.'DBNAME,'r')
  942.                     Open('FAMILYI',FfilN'I.html','w')
  943. WriteLn('FAMILYI','<HTML>')
  944. WriteLn('FAMILYI','<TITLE>'FULLNAME' Family Information</TITLE>')
  945. WriteCh('FAMILYI','<H2>Family of 'MFULLNAME' and 'MSPOUSEFULLNAME)
  946. WriteCh('FAMILYI',' <A HREF="GenealogyFile.html">')
  947. WriteLn('FAMILYI','<B>List of Persons.</B></A></H2><PRE><TT>')
  948.                     DO While ~EOF('FNDBNAME')
  949.                         line = ReadLn('FNDBNAME')
  950.                         WriteLn('FAMILYI',CheckForReplacement(line))
  951. IF DoGenText THEN WriteLn('GenealogyText',spcs'  'CheckForNAReplacement(line))
  952.                     END
  953.                     Close('FNDBNAME')
  954.                     WriteLn('FAMILYI','</HTML>')
  955.                     Close('FAMILYI')
  956.                     END
  957. /**/
  958.                 IF MARRIAGECELEBRANT ~= '' | Minfo THEN DO
  959.                     WriteCh('PERSONFILE',spcs)
  960.                     IF Minfo THEN
  961. WriteCh('PERSONFILE','(<A HREF="Family'mFGRN'I.html"><B>family info</B></A>) ')
  962.                     IF MARRIAGECELEBRANT ~= '' THEN DO
  963. WriteCh('PERSONFILE',FAMLABEL1': 'MARRIAGECELEBRANT)
  964. IF DoGenText THEN WriteLn('GenealogyText',spcs||FAMLABEL1': 'MARRIAGEnCELEBRANT)
  965.                         END
  966.                     WriteLn('PERSONFILE','')
  967.                     END
  968.                 IF MARRIAGECOMMENT ~= '' THEN DO
  969. WriteLn('PERSONFILE',spcs'  'FAMLABEL2': 'MARRIAGECOMMENT)
  970. IF DoGenText THEN WriteLn('GenealogyText',spcs'  'FAMLABEL2': 'MARRIAGEnCOMMENT)
  971.                     END
  972. /*********************************************************************************/
  973.  
  974.     DO k = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */
  975.         'GETCHILD' mFGRN k
  976.         mFGRNc = RESULT
  977.         'GETFIRSTNAME' mFGRNc
  978.         mFGRNcFIRSTNAME = RESULT
  979. /**/
  980.         IF mFGRNcFIRSTNAME ~= "" THEN DO
  981.             HasCHILDREN = 1
  982.             'GETLASTNAME' mFGRNc
  983.             mFGRNcLASTNAME = GetLastName(RESULT)
  984.             'GETFIRSTNAME' mFGRNc
  985.             mFGRNcFIRSTNAME = RESULT
  986.             'GETSEX' mFGRNc
  987. mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  988.             thelastname = mFGRNcLASTNAME
  989.             thegender = mFGRNcGENDER
  990. mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  991. MmFGRNcFULLNAME = MGetFullName(mFGRNcFIRSTNAME)
  992. PmFGRNcFULLNAME = PGetFullName(mFGRNcFIRSTNAME)
  993.             'GETBIRTHDATE' mFGRNc
  994.             mFGRNcBIRTHDATE = RESULT
  995.             'GETDEATHDATE' mFGRNc
  996.             mFGRNcDEATHDATE = RESULT
  997. /**/
  998.             IF mFGRNcBIRTHDATE = "" THEN
  999. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,6) mFGRNc)
  1000.             ELSE
  1001. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,4) mFGRNcBIRTHDATE)
  1002.  
  1003.             jk = MARRIAGES - i
  1004. WriteCh('PERSONFILE',vert.jk'      |_____ <A HREF="'mFGRNcFILENAME'.html">')
  1005. /**/
  1006.             IF mFGRNcLASTNAME ~= LASTNAME THEN
  1007. WriteCh('PERSONFILE',MmFGRNcFULLNAME)
  1008.             ELSE DO
  1009. IF mFGRNcGENDER = "m" THEN WriteCh('PERSONFILE','<B>'mFGRNcFIRSTNAME'</B>')
  1010. IF mFGRNcGENDER = "f" THEN WriteCh('PERSONFILE','<I>'mFGRNcFIRSTNAME'</I>')
  1011.                 END
  1012. WriteCh('PERSONFILE','</A> ')
  1013. /**/
  1014.             IF mFGRNcBIRTHDATE ~= "" THEN
  1015. WriteCh('PERSONFILE','   * 'mFGRNcBIRTHDATE)
  1016. /**/
  1017.             IF mFGRNcDEATHDATE ~= "" THEN
  1018. WriteCh('PERSONFILE','   + 'mFGRNcDEATHDATE)
  1019.  
  1020. Writeln('PERSONFILE','')
  1021. IF DoGenText THEN DO
  1022.     WriteCh('GenealogyText',vert.jk'      |_____ 'PmFGRNcFULLNAME)
  1023.     IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'mFGRNcBIRTHDATE)
  1024.     IF mFGRNcDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'mFGRNcDEATHDATE)
  1025.     WriteLn('GenealogyText','')
  1026.     END
  1027.             END
  1028.         END
  1029.     END
  1030. /*********************************************************************************/
  1031.                 END
  1032.         END
  1033.     ELSE DO
  1034.         WriteLn('PERSONFILE','  |')
  1035.         IF DoGenText THEN WriteLn('GenealogyText','  |')
  1036.         WriteLn('PERSONFILE','  'MFULLNAME)
  1037.         IF DoGenText THEN WriteLn('GenealogyText','  'PFULLNAME)
  1038.     END
  1039.     WriteLn('PERSONFILE','</TT></PRE>')
  1040.     IF HasPARENTS THEN DO
  1041.         WriteLn('PERSONFILE','<HR>')
  1042.         IF DoGenText THEN DO
  1043.             WriteLn('GenealogyText','')
  1044.             WriteLn('GenealogyText','-----------------------------------------------------------')
  1045.             WriteLn('GenealogyText','')
  1046.             END
  1047.         WriteCh('PERSONFILE','<H3>Ancestors of ')
  1048.         WriteCh('PERSONFILE','<B>'MFULLNAME)
  1049.         WriteLn('PERSONFILE','</H3>')
  1050.         IF DoGenText THEN WriteLn('GenealogyText',' Ancestors of 'PFULLNAME)
  1051.         IF DoGenText THEN WriteLn('GenealogyText','')
  1052.         WriteLn('PERSONFILE','<PRE><TT>')
  1053.         Paternal(ScionIRN,'  ')
  1054.         WriteCh('PERSONFILE','<H2>'MFULLNAME)
  1055.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHDATE)
  1056.         IF DEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'DEATHDATE)
  1057.         WriteLn('PERSONFILE','</H2>')
  1058.         IF DoGenText THEN DO
  1059.             WriteCh('GenealogyText',PFULLNAME)
  1060.             IF BIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'BIRTHDATE)
  1061.             IF DEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'DEATHDATE)
  1062.             WriteLn('GenealogyText','')
  1063.             END
  1064.         Maternal(ScionIRN,'  ')
  1065.         WriteLn('PERSONFILE','</TT></PRE>')
  1066.         END
  1067. /*    ELSE */
  1068. IF HasCHILDREN THEN DO
  1069.         WriteLn('PERSONFILE','<HR>')
  1070.         IF DoGenText THEN DO
  1071.             WriteLn('GenealogyText','')
  1072.             WriteLn('GenealogyText','-----------------------------------------------------------')
  1073.             WriteLn('GenealogyText','')
  1074.             WriteLn('GenealogyText',' Descendants of 'PFULLNAME)
  1075.             WriteLn('GenealogyText','')
  1076.             END
  1077.         WriteLn('PERSONFILE','<H3>Descendants of 'MFULLNAME'</H3>')
  1078.         indent = "  "
  1079.         WriteLn('PERSONFILE','<PRE><TT>')
  1080.         WriteCh('PERSONFILE',indent||MFULLNAME)
  1081.         IF BIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'BIRTHDATE)
  1082.         IF DEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'DEATHDATE)
  1083.         WriteLn('PERSONFILE','<BR>')
  1084.         IF DoGenText THEN DO
  1085.             WriteCh('GenealogyText',indent || PFULLNAME)
  1086.             IF BIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'BIRTHDATE)
  1087.             IF DEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'DEATHDATE)
  1088.             WriteLn('GenealogyText','')
  1089.             END
  1090.         marriagesANDchildren(ScionIRN,indent)
  1091.         WriteLn('PERSONFILE','</TT></PRE>')
  1092.         END
  1093. /*    WriteLn('PERSONFILE','<HR>')
  1094.     WriteLn('PERSONFILE','<Address>')
  1095.     'GETPROGVERSION'
  1096.     VERSION = RESULT
  1097.     WriteCh('PERSONFILE','<H3>ScionGenealogist')
  1098.     IF VERSION > 0 THEN WriteCh('PERSONFILE',' V 'VERSION)
  1099.     WriteLn('PERSONFILE',' © Robbie J Akins; ')
  1100.     WriteLn('PERSONFILE','ScionToMosaic.rexx © Harold H. Ipolyi</H3>')
  1101.     WriteLn('PERSONFILE','</Address>')                    */
  1102.     WriteLn('PERSONFILE','</HTML>')
  1103.     Close('PERSONFILE')
  1104.     IF DoGenText THEN WriteLn('GenealogyText',' ')
  1105.  
  1106.     IF target = "NORMAL" & LASTNAME ~= "" THEN DO
  1107.         WriteCh('GenealogyFile','<A HREF="'PERSONFILENAME'.html">')
  1108.         WriteCh('GenealogyFile',MFULLNAME)
  1109.         WriteCh('GenealogyFile','</A>')
  1110.         IF BIRTHDATE ~= "" THEN WriteCh('GenealogyFile','  *'BIRTHDATE)
  1111.         IF DEATHDATE ~= "" THEN WriteCh('GenealogyFile',' +'DEATHDATE)
  1112. /*********************************************************************************/
  1113. IF HasFATHER THEN DO
  1114.     WriteCh('GenealogyFile',' (()) ')
  1115.     IF HasFileFATHER THEN WriteCh('GenealogyFile','<A HREF="'FATHERFILENAME'.html">')
  1116.     WriteCh('GenealogyFile',' 'MFATHERFULLNAME)
  1117.     IF HasFileFATHER THEN WriteCh('GenealogyFile','</A>')
  1118.     IF HasMOTHER THEN DO
  1119.         IF HasFATHER THEN WriteCh('GenealogyFile',' //\ ')
  1120.         IF HasFileMOTHER THEN WriteCh('GenealogyFile','<A HREF="'MOTHERFILENAME'.html">')
  1121.         WriteCh('GenealogyFile',MMOTHERFULLNAME)
  1122.         IF HasFileMOTHER THEN WriteCh('GenealogyFile','</A>')
  1123.         END
  1124.     END
  1125. /*********************************************************************************/
  1126.     WriteLn('GenealogyFile','<BR>')    /* do not close, we have many more to go. */
  1127. END
  1128.  
  1129.     RETURN
  1130.  
  1131.  
  1132.  
  1133.  
  1134.  
  1135. IsNumeric: PROCEDURE
  1136.     PARSE ARG str
  1137.     RETURN DataType(str, 'W')
  1138.  
  1139.  
  1140.     /* create a file name short but unique */
  1141.  
  1142. FilName: PROCEDURE
  1143.     PARSE ARG finm lanm bdate
  1144.     RETURN Space(substr(finm,1,2) substr(lanm,1,4) bdate)
  1145.  
  1146. /******************************** Makedir **********************************/
  1147.  
  1148. /* Makedir - If a directory under the given name already exists, or can be
  1149.    created, return 1, otherwise return 0. Though this function works
  1150.    correctly under Workbench 1.3, it has the same effect as the existing
  1151.    MAKEDIR; hence it is useful only under 2.0.
  1152. */
  1153. Makedir: procedure
  1154.    ds = statef(arg(1))
  1155.  
  1156.    if ds='' then
  1157.       result = 'MAKEDIR'(arg(1))
  1158.    else
  1159.       result = left(ds,3) = 'DIR'
  1160.  
  1161.    return result
  1162.  
  1163. CheckForReplacement: PROCEDURE
  1164.     PARSE ARG line "<" last
  1165.     IF last = "" THEN RETURN CheckReplacement(line)
  1166.     RIRN = GetRIRN(last || ".")
  1167.     IF RIRN = 0 THEN RETURN line || "<" || last
  1168.     last = CheckForReplacement(last)        /* recursion */
  1169.     lastend = GetEnd(last || ".")
  1170.     'GETLASTNAME' RIRN
  1171.     RIRNLASTNAME = GetLastName(RESULT)
  1172.     'GETFIRSTNAME' RIRN
  1173.     RIRNFIRSTNAME = RESULT
  1174.     thelastname = RIRNLASTNAME
  1175.     'GETBIRTHDATE' RIRN
  1176.     RIRNBIRTHDATE = RESULT
  1177.     'GETSEX' RIRN
  1178.     IF translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" THEN
  1179.         RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1180.     ELSE
  1181.         RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1182.     IF RIRNLASTNAME = "" THEN
  1183.         RETURN line || RIRNFULLNAME || lastend
  1184.     IF RIRNBIRTHDATE = "" THEN
  1185. RIRNFILENAME = Space(substr(RIRNFIRSTNAME,1,2) substr(RIRNLASTNAME,1,6) RIRN)
  1186.     ELSE
  1187. RIRNFILENAME = Space(substr(RIRNFIRSTNAME,1,2) substr(RIRNLASTNAME,1,4) RIRNBIRTHDATE)
  1188.     RETURN line || '<A HREF="'RIRNFILENAME'.html">'RIRNFULLNAME'</A>' || lastend
  1189.  
  1190. CheckReplacement: PROCEDURE
  1191.     PARSE ARG line "[" last
  1192.     IF last = "" THEN RETURN line
  1193.     RIRN = GetaRIRN(last || ".")
  1194.     IF RIRN = 0 THEN RETURN line || "[" || last
  1195.     last = CheckForReplacement(last)        /* recursion */
  1196.     lastend = GetaEnd(last || ".")
  1197.     'GETLASTNAME' RIRN
  1198.     RIRNLASTNAME = GetLastName(RESULT)
  1199.     'GETFIRSTNAME' RIRN
  1200.     RIRNFIRSTNAME = RESULT
  1201.     thelastname = RIRNLASTNAME
  1202.     'GETBIRTHDATE' RIRN
  1203.     RIRNBIRTHDATE = RESULT
  1204.     'GETSEX' RIRN
  1205.     IF translate(RESULT,xrange('a','z'),xrange('A','Z')) = "m" THEN
  1206.         RIRNFULLNAME = '<B>' || GetFullName(RIRNFIRSTNAME) || '</B>'
  1207.     ELSE
  1208.         RIRNFULLNAME = '<I>' || GetFullName(RIRNFIRSTNAME) || '</I>'
  1209.     IF RIRNLASTNAME = "" THEN
  1210.         RETURN line || RIRNFULLNAME || lastend
  1211.     IF RIRNBIRTHDATE = "" THEN
  1212. RIRNFILENAME = Space(substr(RIRNFIRSTNAME,1,2) substr(RIRNLASTNAME,1,6) RIRN)
  1213.     ELSE
  1214. RIRNFILENAME = Space(substr(RIRNFIRSTNAME,1,2) substr(RIRNLASTNAME,1,4) RIRNBIRTHDATE)
  1215.     RETURN line || '<A HREF="'RIRNFILENAME'.html">'RIRNFULLNAME'</A>' || lastend
  1216.  
  1217. CheckForNAReplacement: PROCEDURE
  1218.     PARSE ARG line "<" last
  1219.     IF last = "" THEN RETURN CheckNAReplacement(line)
  1220.     RIRN = GetRIRN(last || ".")
  1221.     IF RIRN = 0 THEN RETURN line || "<" || last
  1222.     last = CheckForNAReplacement(last)        /* recursion */
  1223.     lastend = GetEnd(last || ".")
  1224.     'GETLASTNAME' RIRN
  1225.     RIRNLASTNAME = GetLastName(RESULT)
  1226.     'GETFIRSTNAME' RIRN
  1227.     RIRNFIRSTNAME = RESULT
  1228.     thelastname = RIRNLASTNAME
  1229.     'GETBIRTHDATE' RIRN
  1230.     RIRNBIRTHDATE = RESULT
  1231.     'GETSEX' RIRN
  1232.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1233.     thelastname = GetFullName(RIRNLASTNAME)
  1234.     thegender = GENDER
  1235.     IF thegender = "m" THEN
  1236.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1237.     ELSE
  1238.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1239.     RETURN line || RIRNFULLNAME lastend
  1240.  
  1241. CheckNAReplacement: PROCEDURE
  1242.     PARSE ARG line "[" last
  1243.     IF last = "" THEN RETURN line
  1244.     RIRN = GetaRIRN(last || ".")
  1245.     IF RIRN = 0 THEN RETURN line || "[" || last
  1246.     last = CheckForNAReplacement(last)        /* recursion */
  1247.     lastend = GetaEnd(last || ".")
  1248.     'GETLASTNAME' RIRN
  1249.     RIRNLASTNAME = GetLastName(RESULT)
  1250.     'GETFIRSTNAME' RIRN
  1251.     RIRNFIRSTNAME = RESULT
  1252.     thelastname = RIRNLASTNAME
  1253.     'GETBIRTHDATE' RIRN
  1254.     RIRNBIRTHDATE = RESULT
  1255.     'GETSEX' RIRN
  1256.     GENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1257.     thelastname = GetFullName(RIRNLASTNAME)
  1258.     thegender = GENDER
  1259.     IF thegender = "m" THEN
  1260.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1261.     ELSE
  1262.         RIRNFULLNAME = '' || GetFullName(RIRNFIRSTNAME) || ''
  1263.     RETURN line || RIRNFULLNAME lastend
  1264.  
  1265. Paternal: PROCEDURE EXPOSE DoGenText
  1266.     PARSE ARG irn, indent
  1267.     'GETPARENTS' irn
  1268.     PARENTS = RESULT
  1269.     'GETPRINCIPAL' PARENTS
  1270.     PRINCIPAL = RESULT
  1271.     'GETSPOUSE' PARENTS
  1272.     SPOUSE = RESULT
  1273.     'GETSEX' PRINCIPAL
  1274.     IF RESULT = 'M' THEN DO
  1275.         FIRN = PRINCIPAL
  1276.         MIRN = SPOUSE
  1277.         END
  1278.     ELSE DO
  1279.         FIRN = SPOUSE
  1280.         MIRN = PRINCIPAL
  1281.         END
  1282.     pirn = FIRN
  1283.     IF 't'pirn't' ~= 'tt' THEN DO
  1284.         Paternal(pirn,'     'indent)
  1285.         'GETLASTNAME' pirn
  1286.         pirnLASTNAME = GetLastName(RESULT)
  1287.         thelastname = pirnLASTNAME
  1288.         'GETFIRSTNAME' pirn
  1289.         pirnFIRSTNAME = RESULT
  1290.         pirnFULLNAME = GetFullName(pirnFIRSTNAME)
  1291.         'GETBIRTHDATE' pirn
  1292.         pirnBIRTHDATE = RESULT
  1293.         IF pirnLASTNAME ~= "" THEN DO
  1294.             IF pirnBIRTHDATE = "" THEN
  1295. pirnPERSONFILENAME = Space(substr(pirnFIRSTNAME,1,2) substr(pirnLASTNAME,1,6) pirn)
  1296.             ELSE
  1297. pirnPERSONFILENAME = Space(substr(pirnFIRSTNAME,1,2) substr(pirnLASTNAME,1,4) pirnBIRTHDATE)
  1298.             END
  1299.         WriteCh('PERSONFILE',indent'- ')
  1300.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'pirnPERSONFILENAME'.html">')
  1301.         WriteCh('PERSONFILE','<B>'pirnFULLNAME)
  1302.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1303.         IF pirnBIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'pirnBIRTHDATE)
  1304.         'GETDEATHDATE' pirn
  1305.         pirnDEATHDATE = RESULT
  1306.         IF pirnDEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'pirnDEATHDATE)
  1307.         WriteLn('PERSONFILE','</B>')
  1308.         IF DoGenText THEN DO
  1309.             WriteCh('GenealogyText',indent'- 'pirnFULLNAME)
  1310.             IF pirnBIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'pirnBIRTHDATE)
  1311.             IF pirnDEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'pirnDEATHDATE)
  1312.             WriteLn('GenealogyText','')
  1313.             END
  1314.         Maternal(pirn,'     'indent)
  1315.         END
  1316.     RETURN 0
  1317.  
  1318. Maternal: PROCEDURE EXPOSE DoGenText
  1319.     PARSE ARG irn, indent
  1320.     'GETPARENTS' irn
  1321.     PARENTS = RESULT
  1322.     'GETPRINCIPAL' PARENTS
  1323.     PRINCIPAL = RESULT
  1324.     'GETSPOUSE' PARENTS
  1325.     SPOUSE = RESULT
  1326.     'GETSEX' PRINCIPAL
  1327.     IF RESULT = 'M' THEN DO
  1328.         FIRN = PRINCIPAL
  1329.         MIRN = SPOUSE
  1330.         END
  1331.     ELSE DO
  1332.         FIRN = SPOUSE
  1333.         MIRN = PRINCIPAL
  1334.         END
  1335.     pirn = MIRN
  1336.     IF 't'pirn't' ~= 'tt' THEN DO
  1337.         Paternal(pirn,'     'indent)
  1338.         'GETLASTNAME' pirn
  1339.         pirnLASTNAME = GetLastName(RESULT)
  1340.         thelastname = pirnLASTNAME
  1341.         'GETFIRSTNAME' pirn
  1342.         pirnFIRSTNAME = RESULT
  1343.         pirnFULLNAME = GetFullName(pirnFIRSTNAME)
  1344.         'GETBIRTHDATE' pirn
  1345.         pirnBIRTHDATE = RESULT
  1346.         IF pirnLASTNAME ~= "" THEN DO
  1347.             IF pirnBIRTHDATE = "" THEN
  1348. pirnPERSONFILENAME = Space(substr(pirnFIRSTNAME,1,2) substr(pirnLASTNAME,1,6) pirn)
  1349.             ELSE
  1350. pirnPERSONFILENAME = Space(substr(pirnFIRSTNAME,1,2) substr(pirnLASTNAME,1,4) pirnBIRTHDATE)
  1351.             END
  1352.         WriteCh('PERSONFILE',indent'- ')
  1353.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','<A HREF="'pirnPERSONFILENAME'.html">')
  1354.         WriteCh('PERSONFILE','<I>'pirnFULLNAME)
  1355.         IF pirnLASTNAME ~= "" THEN WriteCh('PERSONFILE','</A>')
  1356.         IF pirnBIRTHDATE ~= "" THEN WriteCh('PERSONFILE',' * 'pirnBIRTHDATE)
  1357.         'GETDEATHDATE' pirn
  1358.         pirnDEATHDATE = RESULT
  1359.         IF pirnDEATHDATE ~= "" THEN WriteCh('PERSONFILE',' + 'pirnDEATHDATE)
  1360.         WriteLn('PERSONFILE','</I>')
  1361.         IF DoGenText THEN DO
  1362.             WriteCh('GenealogyText',indent'- 'pirnFULLNAME)
  1363.             IF pirnBIRTHDATE ~= "" THEN WriteCh('GenealogyText',' * 'pirnBIRTHDATE)
  1364.             IF pirnDEATHDATE ~= "" THEN WriteCh('GenealogyText',' + 'pirnDEATHDATE)
  1365.             WriteLn('GenealogyText','')
  1366.             END
  1367.         Maternal(pirn,'     'indent)
  1368.         END
  1369.     RETURN 0
  1370.  
  1371. marriagesANDchildren: PROCEDURE EXPOSE DoGenText
  1372.         PARSE ARG ScionIRN,indent
  1373.     DO i = 0 TO 39            /*    ??? GETTOTMARRIAGES IRN ???    */
  1374.         'GETMARRIAGE' ScionIRN i
  1375.         MARRIAGE = RESULT
  1376.         IF MARRIAGE > -1 THEN DO
  1377.             MARRIAGES = i
  1378.             END
  1379.     END
  1380.     tMARRIAGESt = 't'MARRIAGES't'
  1381. /*      Say 'MARRIAGES = 'MARRIAGES tMARRIAGESt */
  1382.  
  1383.     IF tMARRIAGESt ~= 'tMARRIAGESt' THEN DO
  1384.         DO i = 0 TO MARRIAGES
  1385.             'GETMARRIAGE' ScionIRN i
  1386.             mFGRN = RESULT
  1387.             IF mFGRN ~= "" THEN DO
  1388.                 'GETSPOUSE' mFGRN
  1389.                 SPOUSE = RESULT
  1390.                 IF SPOUSE = ScionIRN THEN
  1391.                     DO
  1392.                     'GETPRINCIPAL' mFGRN
  1393.                     SPOUSE = RESULT
  1394.                     END
  1395.                 'GETLASTNAME' SPOUSE
  1396.                 SPOUSELASTNAME = GetLastName(RESULT)
  1397.                 'GETFIRSTNAME' SPOUSE
  1398.                 SPOUSEFIRSTNAME = RESULT
  1399.                 thelastname = SPOUSELASTNAME
  1400.                 'GETSEX' SPOUSE
  1401.                 thegender = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1402. SPOUSEFULLNAME = GetFullName(SPOUSEFIRSTNAME)
  1403. MSPOUSEFULLNAME = MGetFullName(SPOUSEFIRSTNAME)
  1404. PSPOUSEFULLNAME = PGetFullName(SPOUSEFIRSTNAME)
  1405.                 'GETBIRTHDATE' SPOUSE
  1406.                 SPOUSEBIRTHDATE = RESULT
  1407.                 'GETDEATHDATE' SPOUSE
  1408.                 SPOUSEDEATHDATE = RESULT
  1409.                 IF SPOUSEBIRTHDATE = "" THEN
  1410. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,6) SPOUSE)
  1411.                 ELSE
  1412. SPOUSEFILENAME = Space(substr(SPOUSEFIRSTNAME,1,2) substr(SPOUSELASTNAME,1,4) SPOUSEBIRTHDATE)
  1413.                 WriteCH('PERSONFILE',indent'spouse: ')
  1414.                 IF SPOUSELASTNAME ~= "" THEN
  1415. WriteCh('PERSONFILE','<A HREF="'SPOUSEFILENAME'.html">')
  1416. WriteCh('PERSONFILE',MSPOUSEFULLNAME)
  1417.                 IF SPOUSELASTNAME ~= "" THEN
  1418. WriteCh('PERSONFILE','</A>')
  1419.                 IF SPOUSEBIRTHDATE ~= "" THEN
  1420. WriteCh('PERSONFILE','   * 'SPOUSEBIRTHDATE)
  1421.                 IF SPOUSEDEATHDATE ~= "" THEN
  1422. WriteCh('PERSONFILE','   * 'SPOUSEDEATHDATE)
  1423.                 IF DoGenText THEN DO
  1424. WriteCh('GenealogyText',indent'spouse: 'PSPOUSEFULLNAME)
  1425.                     IF SPOUSEBIRTHDATE ~= "" THEN
  1426. WriteCh('GenealogyText','   * 'SPOUSEBIRTHDATE)
  1427.                     IF SPOUSEDEATHDATE ~= "" THEN
  1428. WriteCh('GenealogyText','   * 'SPOUSEDEATHDATE)
  1429. WriteLn('GenealogyText','')
  1430.                     END
  1431.                 WriteLn('PERSONFILE','<BR>')
  1432.     indent2 = indent || " | "
  1433.     DO k = 0 TO 39            /*    ??? GETTOTCHILDREN FGRN ???    */            
  1434.         'GETCHILD' mFGRN k
  1435.         mFGRNc = RESULT
  1436.         'GETFIRSTNAME' mFGRNc
  1437.         mFGRNcFIRSTNAME = RESULT
  1438. /**/
  1439.         IF mFGRNcFIRSTNAME ~= "" THEN DO
  1440.             'GETLASTNAME' mFGRNc
  1441.             mFGRNcLASTNAME = GetLastName(RESULT)
  1442.             'GETFIRSTNAME' mFGRNc
  1443.             mFGRNcFIRSTNAME = RESULT
  1444.             'GETSEX' mFGRNc
  1445. mFGRNcGENDER = translate(RESULT,xrange('a','z'),xrange('A','Z'))
  1446.             thelastname = mFGRNcLASTNAME
  1447.             thegender = mFGRNcGENDER
  1448. mFGRNcFULLNAME = GetFullName(mFGRNcFIRSTNAME)
  1449. MmFGRNcFULLNAME = MGetFullName(mFGRNcFIRSTNAME)
  1450. PmFGRNcFULLNAME = PGetFullName(mFGRNcFIRSTNAME)
  1451.             'GETBIRTHDATE' mFGRNc
  1452.             mFGRNcBIRTHDATE = RESULT
  1453.             'GETDEATHDATE' mFGRNc
  1454.             mFGRNcDEATHDATE = RESULT
  1455. /**/
  1456.             IF mFGRNcBIRTHDATE = "" THEN
  1457. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,6) mFGRNc)
  1458.             ELSE
  1459. mFGRNcFILENAME = Space(substr(mFGRNcFIRSTNAME,1,2) substr(mFGRNcLASTNAME,1,4) mFGRNcBIRTHDATE)
  1460. /**/
  1461. WriteCh('PERSONFILE',indent2||'<A HREF="'mFGRNcFILENAME'.html">'MmFGRNcFULLNAME'</A> ')
  1462. /**/
  1463.             IF mFGRNcBIRTHDATE ~= "" THEN
  1464. WriteCh('PERSONFILE','   * 'mFGRNcBIRTHDATE)
  1465. /**/
  1466.             IF mFGRNcDEATHDATE ~= "" THEN
  1467. WriteCh('PERSONFILE','   + 'mFGRNcDEATHDATE)
  1468.  
  1469. Writeln('PERSONFILE','<BR>')
  1470. IF DoGenText THEN DO
  1471.     WriteCh('GenealogyText',indent2||PmFGRNcFULLNAME)
  1472.     IF mFGRNcBIRTHDATE ~= "" THEN WriteCh('GenealogyText','   * 'mFGRNcBIRTHDATE)
  1473.     IF mFGRNcDEATHDATE ~= "" THEN WriteCh('GenealogyText','   + 'mFGRNcDEATHDATE)
  1474.     WriteLn('GenealogyText','')
  1475.     END
  1476. /**********************/
  1477.             marriagesANDchildren(mFGRNc,indent2)
  1478.             END
  1479.     END
  1480.                 END
  1481.             END
  1482.         END
  1483.     RETURN 0
  1484.  
  1485. GetRIRN: PROCEDURE
  1486.     PARSE ARG numb ">" last
  1487.     IF last = "" THEN RETURN 0
  1488.     IF IsNumeric(numb) THEN RETURN numb
  1489.     RETURN 0
  1490.  
  1491. GetaRIRN: PROCEDURE
  1492.     PARSE ARG numb "]" last
  1493.     IF last = "" THEN RETURN 0
  1494.     IF IsNumeric(numb) THEN RETURN numb
  1495.     RETURN 0
  1496.  
  1497. GetEnd: PROCEDURE
  1498.     PARSE ARG line ">" last
  1499.     IF last = "" THEN RETURN substr(line,1,length(line)-1)
  1500.     RETURN substr(last,1,length(last)-1)
  1501.  
  1502. GetaEnd: PROCEDURE
  1503.     PARSE ARG line "]" last
  1504.     IF last = "" THEN RETURN substr(line,1,length(line)-1)
  1505.     RETURN substr(last,1,length(last)-1)
  1506.  
  1507. GetLength: PROCEDURE
  1508.     PARSE UPPER ARG names
  1509.     nonletters = length(compress(names, xrange('A','Z')))
  1510.     RETURN Length(names) - nonletters * 4 / 10
  1511.  
  1512.     /* create a full name from first, last, and honorifics parts */
  1513.  
  1514. GetFullName: PROCEDURE EXPOSE thelastname
  1515.     PARSE ARG firstnames "," hon
  1516.     IF hon = "" THEN DO
  1517.         IF length(firstnames) > 2 THEN
  1518.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1519.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1520.         RETURN firstnames thelastname
  1521.         END
  1522.     RETURN firstnames Space(thelastname) || ","hon
  1523.     
  1524. MGetFullName: PROCEDURE EXPOSE thelastname thegender
  1525.     PARSE ARG firstnames "," hon
  1526.     gchar = "B"
  1527.     IF thegender = "f" THEN gchar = "I"
  1528.     IF hon = "" THEN DO
  1529.         IF length(firstnames) > 2 THEN
  1530.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1531.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1532.         RETURN "<"gchar">"firstnames thelastname"</"gchar">"
  1533.         END
  1534.     RETURN "<"gchar">"firstnames Space(thelastname) || ","hon"</"gchar">"
  1535.     
  1536. PGetFullName: PROCEDURE EXPOSE thelastname thegender
  1537.     PARSE ARG firstnames "," hon
  1538.     schar = "1"
  1539.     uchar = "2"
  1540.     IF thegender = "f" THEN DO
  1541.         schar = "3"
  1542.         uchar = "3"
  1543.         END
  1544.     IF hon = "" THEN DO
  1545.         IF length(firstnames) > 2 THEN
  1546.             IF substr(firstnames,length(firstnames)-1,length(firstnames)) = "V." THEN
  1547.                 firstnames = substr(firstnames,1,length(firstnames)-2) || "v."
  1548.         RETURN ""schar"m"firstnames thelastname""uchar"m"
  1549.         END
  1550.     RETURN ""schar"m"firstnames Space(thelastname) || ","hon""uchar"m"
  1551.     
  1552.  
  1553.  
  1554.     /* Capitalize last name; also handle special cases! */
  1555.     /* End users must customize this code to aviod trashy output */
  1556.  
  1557. GetLastName: PROCEDURE
  1558.     PARSE ARG str
  1559.     IF str = "BAUER-GAUSS" THEN RETURN "Bauer-Gauss"
  1560.         IF str = "DE IPOLYI" THEN RETURN "deIpolyi"
  1561.         IF str = "DEIPOLYI" THEN RETURN "deIpolyi"
  1562.         IF str = "MC GRADY" THEN RETURN "McGrady"
  1563.         IF str = "KIS RED" THEN RETURN "KisRed"
  1564.         IF str = "ROTH-HACKENSCHMIDT" THEN RETURN "Roth-Hackenschmidt"
  1565.     IF str = "SCHüCH-GLICKHFELDEN" THEN RETURN "Schüch-Glickhfelden"
  1566.     ELSE
  1567.         DO
  1568.         spart = translate(substr(str,2,length(str)),xrange('a','z'),xrange('A','Z'))
  1569.         END
  1570.     RETURN substr(str,1,1)Space(spart)
  1571.